import argparse

import autoloader


def parse_opt(known=False):
    parser = argparse.ArgumentParser()
    parser.add_argument('--userid', '--id', type=str, default='', help='输入学号')
    parser.add_argument('--password', '--pw', type=str, default='', help='输入密码')
    parser.add_argument('--date', type=str, default='', help='出校日期，留空为该程序执行当天。不留空的参考格式：2021-04-15')
    parser.add_argument('--startTime', type=str, default='04:00',
                        help='出校门时间，只能为整点。取值范围为[04:00,23:00]（下同）。参考格式：04:00')
    parser.add_argument('--endTime', type=str, default='23:00', help='进校门时间，只能为整点。必须大于出校门时间。参考格式：23:00')
    parser.add_argument('--reason', type=str, choices=['外出实习、实验等常规业务Routine business such as internship and experiment',
                                                       '外出办事Personal affairs(provide reasons)',
                                                       '其他原因Other situations (provide reasons)'],
                        default='其他原因Other situations (provide reasons)', help='出校门理由')
    parser.add_argument('--specificReasons', type=str, default='Hitokoto', help='出校详细理由,'
                                                                                '或者输入参数Bullshit：废话文学生成器'
                                                                                '输入参数Hitokoto：一言API，随机生成名人名言')
    parser.add_argument('--cache', action='store_true', help='开启该选项将会缓存表单到本地')

    opt = parser.parse_known_args()[0] if known else parser.parse_args()
    return opt


def main(opt):
    # 检查参数是否合规
    if opt.userid == '':
        raise ValueError('学号不应该为空')
    if not opt.userid.isdigit() and len(opt.userid) != 9:
        raise ValueError('学号不合规')
    if opt.password == '':
        raise ValueError('密码不应该为空')
    if opt.date != '':
        data_check = opt.date.split('-')
        if len(data_check) == 3:
            if len(data_check[0]) != 4 or len(data_check[1]) != 2 or len(data_check[3]) != 2:
                raise ValueError('日期格式不合规')
        else:
            raise ValueError('日期格式不合规')
    if opt.startTime == '':
        raise ValueError('出校时间不能为空')
    else:
        start_check = opt.startTime.split(':')
        if len(start_check) == 2:
            if len(start_check[0]) != 2 or start_check[1] != '00' or int(start_check[0]) > 23 or int(
                    start_check[0]) < 4:
                raise ValueError('出校时间格式不合规')
        else:
            raise ValueError('出校时间格式不合规')
    if opt.endTime == '':
        raise ValueError('入校时间不能为空')
    else:
        end_check = opt.endTime.split(':')
        if len(end_check) == 2:
            if len(end_check[0]) != 2 or end_check[1] != '00' or int(end_check[0]) > 23 or int(end_check[0]) < 4:
                raise ValueError('入校时间格式不合规')
        else:
            raise ValueError('入校时间格式不合规')
    if int(start_check[0]) >= int(end_check[0]):
        raise ValueError('出校时间不能晚于入校时间')

    test = autoloader.autoloader(opt)
    test.forward()


if __name__ == "__main__":
    opt = parse_opt()
    main(opt)
